package com.haoniu.common.utils.sms;

import com.haoniu.common.config.Global;
import com.haoniu.common.utils.YamlUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.text.MessageFormat;

/**
 * 描述:
 *
 * @author fei
 * @create 2019-03-18 17:51
 */
public class ChuangRuiSms {

    private static final Logger logger = LoggerFactory.getLogger(ChuangRuiSms.class);

    /**
     * 短信网关地址
     */
    private static String WEB_URL="http://web.cr6868.com/asmx/smsservice.aspx";


    /**
     * 用户名
     */
    private static String NAME;


    /**
     * 密码
     */
    private static String PWD;


    /**
     * 网关要求的固定值
     */
    private static String TYPE="mo";

    /**
     * 模板
     */
    private static String MOBAN="";

    private static String ENV = "dev";

    static {
        ENV = Global.getConfig("spring.profiles.active");
        NAME = YamlUtil.getProperty("application-" + ENV + ".yml","sms.chuangRui.name");
        PWD = YamlUtil.getProperty("application-" + ENV + ".yml","sms.chuangRui.pwd");
        MOBAN = YamlUtil.getProperty("application-" + ENV + ".yml","sms.chuangRui.moban");
    }

    /**
     * 发送短信到创瑞平台
     *
     * @param phone
     * @param content
     * @return
     */
    public static boolean send(String phone, String code) {
        boolean status = true;
        String name = NAME;
        // 密码
        String pwd = PWD;
        // 电话号码字符串，中间用英文逗号间隔
        StringBuffer mobileString = new StringBuffer(phone);
        // 内容字符串
        String content = MessageFormat.format(MOBAN, code);
        StringBuffer contextString = new StringBuffer(content);
        // 签名
        String sign = "";

        String url = WEB_URL;
        // 追加发送时间，可为空，为空为及时发送
        String stime = "";
        // 扩展码，必须为数字 可为空
        StringBuffer extno = new StringBuffer();

        try {
            String result = doPost(name, pwd, mobileString, contextString, sign, stime, extno, url);
            System.out.println(result);
        } catch (Exception e) {
            status = false;
            logger.error("发送短信失败", "网络请求失败，手机号：{}", phone);
        }
        return status;
    }

    /**
     * 发送短信
     *
     * @param name          用户名
     * @param pwd           密码
     * @param mobileString  电话号码字符串，中间用英文逗号间隔
     * @param contextString 内容字符串
     * @param sign          签名
     * @param stime         追加发送时间，可为空，为空为及时发送
     * @param extno         扩展码，必须为数字 可为空
     * @return
     * @throws Exception
     */
    public static String doPost(String name, String pwd,
                                StringBuffer mobileString, StringBuffer contextString,
                                String sign, String stime, StringBuffer extno, String url) throws Exception {
        StringBuffer param = new StringBuffer();
        param.append("name=" + name);
        param.append("&pwd=" + pwd);
        param.append("&mobile=").append(mobileString);
        param.append("&content=").append(URLEncoder.encode(contextString.toString(), "UTF-8"));
        param.append("&stime=" + stime);
        param.append("&sign=").append(URLEncoder.encode(sign, "UTF-8"));
        param.append("&type=pt");
        param.append("&extno=").append(extno);
        URL localURL = new URL(url);
        URLConnection connection = localURL.openConnection();
        HttpURLConnection httpURLConnection = (HttpURLConnection) connection;

        httpURLConnection.setDoOutput(true);
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
        httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        httpURLConnection.setRequestProperty("Content-Length", String.valueOf(param.length()));

        OutputStream outputStream = null;
        OutputStreamWriter outputStreamWriter = null;
        InputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader reader = null;
        String resultBuffer = "";

        try {
            outputStream = httpURLConnection.getOutputStream();
            outputStreamWriter = new OutputStreamWriter(outputStream);

            outputStreamWriter.write(param.toString());
            outputStreamWriter.flush();

            if (httpURLConnection.getResponseCode() >= 300) {
                throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
            }

            inputStream = httpURLConnection.getInputStream();
            resultBuffer = convertStreamToString(inputStream);

        } finally {

            if (outputStreamWriter != null) {
                outputStreamWriter.close();
            }

            if (outputStream != null) {
                outputStream.close();
            }

            if (reader != null) {
                reader.close();
            }

            if (inputStreamReader != null) {
                inputStreamReader.close();
            }

            if (inputStream != null) {
                inputStream.close();
            }

        }

        return resultBuffer;
    }

    /**
     * 转换返回值类型为UTF-8格式.
     *
     * @param is
     * @return
     */
    public static String convertStreamToString(InputStream is) {
        StringBuilder sb1 = new StringBuilder();
        byte[] bytes = new byte[4096];
        int size = 0;

        try {
            while ((size = is.read(bytes)) > 0) {
                String str = new String(bytes, 0, size, "UTF-8");
                sb1.append(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb1.toString();
    }
}
